package com.itheima;

public class SpringBoot中的事务Transaction {
    /*
    事务回顾:
    事务 是一组操作的集合，它是一个不可分割的工作单位，这些操作 要么同时成功，要么同时失败。
    开启事务（一组操作开始前，开启事务）：start transaction / begin ;
    提交事务（这组操作全部成功后，提交事务）：commit ;
    回滚事务（中间任何一个操作出现异常，回滚事务）：rollback ;
    */
    /**
     * 如果没有开启事务,那么"删除部门，同时删除该部门下的员工"时,可能出现部门删除成功但是删除员工时报错了,导致部门被删除了，但是部门下的员工却没有删除，造成了数据的不一致
     */


//Spring Boot使用事务非常简单，首先使用注解 @EnableTransactionManagement 开启事务支持后，然后在访问数据库的Service方法上添加注解 @Transactional 便可。
//
//第一步：在SpringBoot启动类上加上@EnableTransactionManagement 开启事务的注解
//
//第二步：service包下的实现类中的方法上面加上@Transactional



    /*
    Spring事务管理
    注解：@Transactional
    位置：业务（service）层的方法上、类上、接口上
    作用：将当前方法交给spring进行事务管理，方法执行前，开启事务；成功执行完毕，提交事务；出现异常，回滚事务
     */
    /**
     * #开启事务管理日志
     * logging:
     *      level:
     *          org.springframework.jdbc.support.JdbcTransactionManager: debug
     */
    /*
    @Transactional的回滚属性
    默认情况下，只有出现 RuntimeException 才回滚异常。
    rollbackFor属性:用于控制出现何种异常类型，回滚事务。
    写法:@Transactional(rollbackFor=IOException.class)
     */
    /**
     * 事务的传播行为(重点)
     * 事务传播行为：指的就是当一个事务方法被另一个事务方法调用时，这个事务方法应该如何进行事务控制。
     *
     * 事务方法b 加入 事务方法a
     *
     * @Transactional
     * public void a(){
     *     ...
     *     userService.b();
     *     ...
     * }
     *
     * @Transactional(propagation = Propagation.REQUIRED)
     * public void b(){
     *     ...
     * }
     *
     * 事务的propagation属性:
     * 属性值            含义
     * REQUIRED         【默认值】需要事务，有则加入，无则创建新事务
     * REQUIRES_NEW     需要新事务，无论有无，总是创建新事务
     * SUPPORTS         支持事务，有则加入，无则在无事务状态中运行
     * NOT_SUPPORTED    不支持事务，在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
     * MANDATORY        必须有事务，否则抛异常
     * NEVER            必须没事务，否则抛异常
     * ...               ...
     *
     * ❤重点记:前两个常见的REQUIRED、REQUIRES_NEW
     * REQUIRED ：大部分情况下都是用该传播行为即可。
     * REQUIRES_NEW ：当我们不希望事务之间相互影响时，可以使用该传播行为。比如：下订单前需要记录日志，不论订单保存成功与否，都需要保证日志记录能够记录成功。
     *
     *
     */
}
